/*
共享工作队列
1. 创建工作队列
*/


#include <linux/module.h>
#include <linux/in.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/workqueue.h>


//工作
struct work_struct test_workqueue_work;

//工作队列
struct workqueue_struct* test_workqueue;

void testwork_func(struct work_struct* work) {
    printk("test_work\n");
}


irqreturn_t test_interrupt(int irq, void* arg) {
    printk("test_interrupt\n");
    queue_work(test_workqueue, &test_workqueue_work);
    return IRQ_HANDLED;
}




static int __init work_queue_init(void)
{
    
    int ret = 0;
    int irq = 0;
    //返回引脚对应中断号
    irq = gpio_to_irq(8);
    printk("irq = %d\n", irq);
    //申请中断
    ret = request_irq(irq, test_interrupt, IRQF_TRIGGER_RISING, "test", NULL);
    if (ret < 0) {
        printk("request_irq failed \n");
        return -1;
    }

    //创建工作队列
    test_workqueue = create_workqueue("test_workqueue");
    if (test_workqueue == NULL) {
        printk("create_workqueue failed \n");
        return -1;
    }
    //动态初始化工作
    INIT_WORK(&test_workqueue_work, testwork_func);
    
    return 0;
}

static void __exit work_queue_exit(void)
{

    
    printk("apply_irq\n");
    free_irq(8, NULL);
    //取消调度工作
    cancel_work_sync(&test_workqueue_work);
    //刷新工作队列
    flush_workqueue(test_workqueue);
    //销毁工作队列
    destroy_workqueue(test_workqueue);
}






module_init(work_queue_init);
module_exit(work_queue_exit);
MODULE_LICENSE("GPL");